package platform

import (
	"fmt"
	"os"
	"path/filepath"

	"golang.org/x/sys/windows/registry"
)

const (
	autoStartRegPath = `Software\Microsoft\Windows\CurrentVersion\Run`
	appName          = "UselessCapsLock"
)

// GetAutoStartStatus 获取开机自启动状态
func GetAutoStartStatus() (bool, error) {
	k, err := registry.OpenKey(registry.CURRENT_USER, autoStartRegPath, registry.QUERY_VALUE)
	if err != nil {
		return false, fmt.Errorf("打开注册表失败: %v", err)
	}
	defer k.Close()

	val, _, err := k.GetStringValue(appName)
	if err == registry.ErrNotExist {
		return false, nil
	}
	if err != nil {
		return false, fmt.Errorf("读取注册表值失败: %v", err)
	}

	// 检查路径是否匹配
	exePath, err := os.Executable()
	if err != nil {
		return false, fmt.Errorf("获取程序路径失败: %v", err)
	}
	return val == exePath, nil
}

// SetAutoStart 设置开机自启动
func SetAutoStart(enable bool) error {
	k, err := registry.OpenKey(registry.CURRENT_USER, autoStartRegPath, registry.SET_VALUE)
	if err != nil {
		return fmt.Errorf("打开注册表失败: %v", err)
	}
	defer k.Close()

	if enable {
		exePath, err := os.Executable()
		if err != nil {
			return fmt.Errorf("获取程序路径失败: %v", err)
		}
		// 使用绝对路径
		exePath, err = filepath.Abs(exePath)
		if err != nil {
			return fmt.Errorf("获取绝对路径失败: %v", err)
		}
		err = k.SetStringValue(appName, exePath)
		if err != nil {
			return fmt.Errorf("设置注册表值失败: %v", err)
		}
	} else {
		err = k.DeleteValue(appName)
		if err != nil && err != registry.ErrNotExist {
			return fmt.Errorf("删除注册表值失败: %v", err)
		}
	}
	return nil
}
